/**
 * RequetesClient.java    19/04/2012
 */

package l3.info.projetJava.client;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.util.List;

import org.apache.log4j.Logger;

import l3.info.projetJava.rmi.RequetesReseau;
import l3.info.projetJava.utilitaires.Configuration;

/**
 * Permet la passerelle Client - Serveur via RMI
 * @author Loïc Martinez & Aboulkacem Hamid
 */
public class RequetesClient {

    /** Connexion avec le ServeurRequetes */
    private static RequetesReseau connexionServer = null;

    /** Configuration du client */
    private Configuration conf = new Configuration("configClient.properties");

    /** Logger */
    private static Logger logger = Logger.getLogger(RequetesClient.class);
    
    /**
     * Constructeur par défaut
     * @throws MalformedURLException, si problème durant le lookup
     * @throws RemoteException, si problème via RMI
     */
    public RequetesClient() throws NotBoundException, RemoteException {
        try {

            connexionServer = (RequetesReseau) Naming.lookup("rmi://"
                    + conf.valueOf("address") + "/serveur");

        } catch (MalformedURLException ex) {
            new JDError("Mauvaise URL");
            logger.error("RequetesClient.RequetesClient() : MalformedURLException");
        }
    }

    /**
     * @return connexionServer
     */
    public RequetesReseau getReseau() {
        return connexionServer;
    }

    /**
     * Permet de savoir si un utilisateur existe dans la base de données
     * (numUtilisateur et mot de passe)
     * @param u, l'utilisateur en question
     * @return l'utilisateur remplit avec des données supplémentaires
     *         s'il existe, tel quel sinon
     * @throws RemoteException 
     */
    public Utilisateur envoyerUtilisateur(Utilisateur u) throws RemoteException {
        return getReseau().utilisateurExists(u);
    }

    /**
     * Permet de suivre un autre utilisateur
     * @param myId, mon numUtilisateur
     * @param id, le numUtilisateur de la personne à suivre
     * @return le pseudo de la personne à suivre,
     *         ou null si un problème survient
     * @throws RemoteException 
     */
    public String envoyerNumUtilisateur(int myId, int id) throws RemoteException {
        return getReseau().suivreUtilisateur(myId, id);
    }

    /**
     * Permet d'arrêter de suivre un utilisateur
     * @param myId, mon numutilisateur
     * @param idToDelete, le numUtilisateur de l'utilisateur
     *        que l'on ne veut plus suivre
     * @throws RemoteException 
     */
    public void removeNumUtilisateur(int myId, int idToDelete) throws RemoteException {
        getReseau().removeUser(myId, idToDelete);
    }

    /**
     * Permet d'envoyer un nouveau message
     * @param myId, mon numutilisateur
     * @param message, le message à envoyer
     * @throws RemoteException 
     */
    public void envoyerMessage(int myId, String message) throws RemoteException {
        getReseau().sendMessage(myId, message);
    }

    /**
     * Permet de récupérer nbMessages à partir du aPartir messages
     * @param aPartir, message à partir duquel on va en chercher
     * @param nbMessages, le nombre de messages à récupérer
     * @param id, l'écrivain du message
     * @throws RemoteException 
     */
    public List<Message> recupererMessages(int aPartir, int nbMessages,
            int myId) throws RemoteException {
        return getReseau().getMessages(aPartir, nbMessages, myId);
    }

    /**
     * Permet de récupérer nbMessages à partir du aPartir messages
     * @param aPartir, message à partir duquel on va en chercher
     * @param nbMessages, le nombre de messages à récupérer
     * @param id, l'écrivain du message
     * @throws RemoteException 
     */
    public List<Message> recupererMessages(int aPartir, int nbMessages,
            int id, String date1, String date2) throws RemoteException {
        return getReseau().getMessages(
                aPartir, nbMessages, id, date1, date2);
    }

    /**
     * Permet de savoir combien est-ce qu'il y a de prochain messages
     * @param aPartir, à partir du aPartir message
     * @param nbMessages, le nombre de messages à voir
     * @param myId, mon id d'utilisateur
     * @return le nombre de messages restants
     * @throws RemoteException 
     */
    public int numberProchainsMessages(int aPartir, int nbMessages, int myId) throws RemoteException {
        return getReseau().getNumberProchainsMessages(
                aPartir, nbMessages, myId);
    }

    /**
     * Permet de savoir combien est-ce qu'il y a de prochain messages
     * @param aPartir, à partir du aPartir message
     * @param nbMessages, le nombre de messages à voir
     * @param myId, mon id d'utilisateur
     * @param date1, la 1ère date
     * @param date2, la 2ème date
     * @return le nombre de messages restants
     * @throws RemoteException 
     */
    public int numberProchainsMessages(int aPartir, int nbMessages, int myId,
            String date1, String date2) throws RemoteException {
        return getReseau().getNumberProchainsMessages(
                aPartir, nbMessages, myId, date1, date2);
    }
}